--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Node / ReticulumProjects / MeshChatX.git / files / tests / backend / test_lxst_telephony_adversarial.py
Displaying Raw • Download
tests/backend/test_lxst_telephony_adversarial.py dev (4e4ef052) Text, 11.53 KB
T8b949e# SPDX-License-Identifier: 0BSD
T8b949e"""Adversarial, property, exploratory, and oracle tests for LXST telephony / web audio.
Oracles (invariants that must always hold):
1. Hostless LineSource/LineSink construct without PulseAudio and never raise on start/stop.
2. WebAudioSource never raises on arbitrary PCM and drops oversized frames.
3. When web_audio is required, bridge.config_enabled is True even if config is False.
4. Codec2-unavailable profile resolution never returns a Codec2 bandwidth profile.
5. install_hostless_lxst_audio is idempotent.
"""
Tff7b72from T7ee787__future__ Tff7b72import Te6edf3annotations
Tff7b72import T7ee787os
Tff7b72from T7ee787unittestT7ee787.T7ee787mock Tff7b72import Te6edf3MagicMockTb4b4b4, Te6edf3patch
Tff7b72import T7ee787numpy Tff7b72as T7ee787np
Tff7b72import T7ee787pytest
Tff7b72from T7ee787hypothesis Tff7b72import Te6edf3givenTb4b4b4, Te6edf3settings
Tff7b72from T7ee787hypothesis Tff7b72import Te6edf3strategies Tff7b72as Te6edf3st
Te6edf3pytestTff7b72.Td2a8ffimportorskipTb4b4b4(Ta5d6ff"Ta5d6ffLXSTTa5d6ff"Tb4b4b4)
Tff7b72from T7ee787LXSTT7ee787.T7ee787PrimitivesT7ee787.T7ee787Telephony Tff7b72import Te6edf3Profiles
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787telephone_manager Tff7b72import Te6edf3TelephoneManager
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787web_audio_bridge Tff7b72import Tb4b4b4(
Te6edf3HostlessAudioSinkTb4b4b4,
Te6edf3HostlessAudioSourceTb4b4b4,
Te6edf3WebAudioBridgeTb4b4b4,
Te6edf3WebAudioSourceTb4b4b4,
Te6edf3hostless_lxst_audio_installedTb4b4b4,
Te6edf3install_hostless_lxst_audioTb4b4b4,
Te6edf3reset_hostless_lxst_audio_for_testsTb4b4b4,
Tb4b4b4)
Te6edf3CODEC2_PROFILES Tff7b72= Tb4b4b4{
Te6edf3ProfilesTff7b72.Td2a8ffBANDWIDTH_ULTRA_LOWTb4b4b4,
Te6edf3ProfilesTff7b72.Td2a8ffBANDWIDTH_VERY_LOWTb4b4b4,
Te6edf3ProfilesTff7b72.Td2a8ffBANDWIDTH_LOWTb4b4b4,
Tb4b4b4}
Tf0883e@pytestTff7b72.Td2a8fffixtureTb4b4b4(Te6edf3autouseTff7b72=Tff7b72TrueTb4b4b4)
Tff7b72def Td2a8ff_reset_hostlessTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3reset_hostless_lxst_audio_for_testsTb4b4b4(Tb4b4b4)
Tff7b72yield
Te6edf3reset_hostless_lxst_audio_for_testsTb4b4b4(Tb4b4b4)
T8b949e# ---------------------------------------------------------------------------
T8b949e# Oracles: hostless backends
T8b949e# ---------------------------------------------------------------------------
Tff7b72def Td2a8fftest_oracle_hostless_source_matches_linesource_ctor_shapeTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3sink Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3sinkTff7b72.Td2a8ffcan_receiveTff7b72.Td2a8ffreturn_value Tff7b72= Tff7b72True
Te6edf3src Tff7b72= Te6edf3HostlessAudioSourceTb4b4b4(
Te6edf3preferred_deviceTff7b72=Ta5d6ff"Ta5d6ffdefaultTa5d6ff"Tb4b4b4,
Te6edf3target_frame_msTff7b72=T79c0ff60Tb4b4b4,
Te6edf3codecTff7b72=Tff7b72NoneTb4b4b4,
Te6edf3sinkTff7b72=Te6edf3sinkTb4b4b4,
Te6edf3filtersTff7b72=Tb4b4b4[Tb4b4b4]Tb4b4b4,
Te6edf3gainTff7b72=Tff7b72-T79c0ff3.0Tb4b4b4,
Te6edf3ease_inTff7b72=T79c0ff0.1Tb4b4b4,
Te6edf3skipTff7b72=T79c0ff0.05Tb4b4b4,
Tb4b4b4)
Te6edf3srcTff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)
Te6edf3srcTff7b72.Td2a8ffstopTb4b4b4(Tb4b4b4)
Te6edf3srcTff7b72.Td2a8ffhandle_frameTb4b4b4(Tff7b72NoneTb4b4b4, Tff7b72NoneTb4b4b4)
Tff7b72assert Te6edf3srcTff7b72.Td2a8ffsamplerate Tff7b72== T79c0ff48000
Tff7b72assert Te6edf3srcTff7b72.Td2a8ffchannels Tff7b72== T79c0ff1
Tff7b72assert Te6edf3srcTff7b72.Td2a8ffcan_receiveTb4b4b4(Tb4b4b4) Tff7b72is Tff7b72True
Tff7b72def Td2a8fftest_oracle_hostless_sink_never_needs_pulseTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3sink Tff7b72= Te6edf3HostlessAudioSinkTb4b4b4(Te6edf3preferred_deviceTff7b72=Tff7b72NoneTb4b4b4)
Te6edf3sinkTff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)
Te6edf3sinkTff7b72.Td2a8ffhandle_frameTb4b4b4(Te6edf3npTff7b72.Td2a8ffzerosTb4b4b4(Tb4b4b4(T79c0ff160Tb4b4b4, T79c0ff1Tb4b4b4)Tb4b4b4, Te6edf3dtypeTff7b72=Te6edf3npTff7b72.Td2a8fffloat32Tb4b4b4)Tb4b4b4, Tff7b72NoneTb4b4b4)
Te6edf3sinkTff7b72.Td2a8ffenable_low_latencyTb4b4b4(Tb4b4b4)
Te6edf3sinkTff7b72.Td2a8ffstopTb4b4b4(Tb4b4b4)
Tff7b72assert Te6edf3sinkTff7b72.Td2a8ffcan_receiveTb4b4b4(Tb4b4b4) Tff7b72is Tff7b72True
Tf0883e@givenTb4b4b4(Te6edf3pcmTff7b72=Te6edf3stTff7b72.Td2a8ffbinaryTb4b4b4(Te6edf3min_sizeTff7b72=T79c0ff0Tb4b4b4, Te6edf3max_sizeTff7b72=Te6edf3WebAudioSourceTff7b72.Td2a8ffMAX_PCM_BYTES Tff7b72+ T79c0ff4096Tb4b4b4)Tb4b4b4)
Tf0883e@settingsTb4b4b4(Te6edf3max_examplesTff7b72=T79c0ff40Tb4b4b4, Te6edf3deadlineTff7b72=Tff7b72NoneTb4b4b4)
Tff7b72def Td2a8fftest_exploratory_hostless_source_push_pcm_never_raisesTb4b4b4(Te6edf3pcmTb4b4b4)Tb4b4b4:
Te6edf3sink Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3sinkTff7b72.Td2a8ffcan_receiveTff7b72.Td2a8ffreturn_value Tff7b72= Tff7b72True
Te6edf3src Tff7b72= Te6edf3HostlessAudioSourceTb4b4b4(Te6edf3target_frame_msTff7b72=T79c0ff60Tb4b4b4, Te6edf3sinkTff7b72=Te6edf3sinkTb4b4b4)
Te6edf3srcTff7b72.Td2a8ffpush_pcmTb4b4b4(Te6edf3pcmTb4b4b4)
Tff7b72def Td2a8fftest_oracle_install_hostless_is_idempotentTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72assert Te6edf3install_hostless_lxst_audioTb4b4b4(Tb4b4b4) Tff7b72is Tff7b72True
Tff7b72assert Te6edf3hostless_lxst_audio_installedTb4b4b4(Tb4b4b4) Tff7b72is Tff7b72True
Tff7b72assert Te6edf3install_hostless_lxst_audioTb4b4b4(Tb4b4b4) Tff7b72is Tff7b72True
Tff7b72from T7ee787LXSTT7ee787.T7ee787Primitives Tff7b72import Te6edf3Telephony Tff7b72as Te6edf3T
Tff7b72assert Te6edf3TTff7b72.Td2a8ffLineSource Tff7b72is Te6edf3HostlessAudioSource
Tff7b72assert Te6edf3TTff7b72.Td2a8ffLineSink Tff7b72is Te6edf3HostlessAudioSink
Tff7b72def Td2a8fftest_oracle_hostless_linesource_constructs_without_soundcardTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72assert Te6edf3install_hostless_lxst_audioTb4b4b4(Tb4b4b4) Tff7b72is Tff7b72True
Tff7b72from T7ee787LXSTT7ee787.T7ee787Primitives Tff7b72import Te6edf3Telephony Tff7b72as Te6edf3T
Te6edf3src Tff7b72= Te6edf3TTff7b72.Td2a8ffLineSourceTb4b4b4(Te6edf3target_frame_msTff7b72=T79c0ff60Tb4b4b4, Te6edf3codecTff7b72=Tff7b72NoneTb4b4b4, Te6edf3sinkTff7b72=Te6edf3MagicMockTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72assert Tffa657isinstanceTb4b4b4(Te6edf3srcTb4b4b4, Te6edf3HostlessAudioSourceTb4b4b4)
Te6edf3sink Tff7b72= Te6edf3TTff7b72.Td2a8ffLineSinkTb4b4b4(Tb4b4b4)
Tff7b72assert Tffa657isinstanceTb4b4b4(Te6edf3sinkTb4b4b4, Te6edf3HostlessAudioSinkTb4b4b4)
T8b949e# ---------------------------------------------------------------------------
T8b949e# Oracles: web audio required / force_enabled
T8b949e# ---------------------------------------------------------------------------
Tff7b72def Td2a8fftest_oracle_force_enabled_overrides_config_falseTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3cfg Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3cfgTff7b72.Td2a8fftelephone_web_audio_enabledTff7b72.Td2a8ffgetTff7b72.Td2a8ffreturn_value Tff7b72= Tff7b72False
Te6edf3bridge Tff7b72= Te6edf3WebAudioBridgeTb4b4b4(Tff7b72NoneTb4b4b4, Te6edf3cfgTb4b4b4, Te6edf3force_enabledTff7b72=Tff7b72TrueTb4b4b4)
Tff7b72assert Te6edf3bridgeTff7b72.Td2a8ffconfig_enabledTb4b4b4(Tb4b4b4) Tff7b72is Tff7b72True
Tff7b72assert Te6edf3bridgeTff7b72.Td2a8ffallow_fallbackTb4b4b4(Tb4b4b4) Tff7b72is Tff7b72False
Te6edf3diag Tff7b72= Te6edf3bridgeTff7b72.Td2a8ffget_diagnosticsTb4b4b4(Tb4b4b4)
Tff7b72assert Te6edf3diagTb4b4b4[Ta5d6ff"Ta5d6ffforce_enabledTa5d6ff"Tb4b4b4] Tff7b72is Tff7b72True
Tff7b72assert Te6edf3diagTb4b4b4[Ta5d6ff"Ta5d6ffconfig_enabledTa5d6ff"Tb4b4b4] Tff7b72is Tff7b72True
Tff7b72def Td2a8fftest_oracle_force_disabled_follows_configTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3cfg Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3cfgTff7b72.Td2a8fftelephone_web_audio_enabledTff7b72.Td2a8ffgetTff7b72.Td2a8ffreturn_value Tff7b72= Tff7b72False
Te6edf3bridge Tff7b72= Te6edf3WebAudioBridgeTb4b4b4(Tff7b72NoneTb4b4b4, Te6edf3cfgTb4b4b4, Te6edf3force_enabledTff7b72=Tff7b72FalseTb4b4b4)
Tff7b72assert Te6edf3bridgeTff7b72.Td2a8ffconfig_enabledTb4b4b4(Tb4b4b4) Tff7b72is Tff7b72False
Tf0883e@givenTb4b4b4(Te6edf3extraTff7b72=Te6edf3stTff7b72.Td2a8ffintegersTb4b4b4(Te6edf3min_valueTff7b72=T79c0ff1Tb4b4b4, Te6edf3max_valueTff7b72=T79c0ff8192Tb4b4b4)Tb4b4b4)
Tf0883e@settingsTb4b4b4(Te6edf3max_examplesTff7b72=T79c0ff20Tb4b4b4, Te6edf3deadlineTff7b72=Tff7b72NoneTb4b4b4)
Tff7b72def Td2a8fftest_oracle_web_audio_drops_oversized_pcmTb4b4b4(Te6edf3extraTb4b4b4)Tb4b4b4:
Te6edf3sink Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3sinkTff7b72.Td2a8ffcan_receiveTff7b72.Td2a8ffreturn_value Tff7b72= Tff7b72True
Te6edf3src Tff7b72= Te6edf3WebAudioSourceTb4b4b4(Te6edf3target_frame_msTff7b72=T79c0ff60Tb4b4b4, Te6edf3sinkTff7b72=Te6edf3sinkTb4b4b4)
Te6edf3srcTff7b72.Td2a8ffpush_pcmTb4b4b4(Ta5d6ffbTa5d6ff"Tffea00\x00Ta5d6ff" Tff7b72* Tb4b4b4(Te6edf3WebAudioSourceTff7b72.Td2a8ffMAX_PCM_BYTES Tff7b72+ Te6edf3extraTb4b4b4)Tb4b4b4)
Te6edf3sinkTff7b72.Td2a8ffhandle_frameTff7b72.Td2a8ffassert_not_calledTb4b4b4(Tb4b4b4)
T8b949e# ---------------------------------------------------------------------------
T8b949e# Oracles: Codec2 profile fallback
T8b949e# ---------------------------------------------------------------------------
Tf0883e@givenTb4b4b4(
Te6edf3pidTff7b72=Te6edf3stTff7b72.Td2a8ffsampled_fromTb4b4b4(
Tffa657listTb4b4b4(Te6edf3ProfilesTff7b72.Td2a8ffavailable_profilesTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72+ Tb4b4b4[T79c0ff0Tb4b4b4, T79c0ff1Tb4b4b4, T79c0ff2Tb4b4b4, T79c0ff99Tb4b4b4, Tff7b72-T79c0ff1Tb4b4b4, T79c0ff255Tb4b4b4, Tff7b72NoneTb4b4b4, Ta5d6ff"Ta5d6ff64Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffnopeTa5d6ff"Tb4b4b4]Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tf0883e@settingsTb4b4b4(Te6edf3max_examplesTff7b72=T79c0ff40Tb4b4b4, Te6edf3deadlineTff7b72=Tff7b72NoneTb4b4b4)
Tff7b72def Td2a8fftest_property_resolve_profile_never_returns_codec2_when_unavailableTb4b4b4(Te6edf3pidTb4b4b4)Tb4b4b4:
Te6edf3tm Tff7b72= Te6edf3TelephoneManagerTb4b4b4(Te6edf3identityTff7b72=Te6edf3MagicMockTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72with Te6edf3patchTff7b72.Td2a8ffobjectTb4b4b4(Te6edf3TelephoneManagerTb4b4b4, Ta5d6ff"Ta5d6ffcodec2_availableTa5d6ff"Tb4b4b4, Te6edf3return_valueTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4:
Te6edf3resolved Tff7b72= Te6edf3tmTff7b72.Td2a8ffresolve_audio_profile_idTb4b4b4(Te6edf3pidTb4b4b4)
Tff7b72assert Te6edf3resolved Tff7b72in Te6edf3ProfilesTff7b72.Td2a8ffavailable_profilesTb4b4b4(Tb4b4b4)
Tff7b72assert Te6edf3resolved Tff7b72not Tff7b72in Te6edf3CODEC2_PROFILES
Tff7b72def Td2a8fftest_oracle_codec2_available_false_on_android_probe_failTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3tm Tff7b72= Te6edf3TelephoneManagerTb4b4b4(Te6edf3identityTff7b72=Te6edf3MagicMockTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72with Tb4b4b4(
Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffmeshchatx.android_codec2._is_chaquopy_androidTa5d6ff"Tb4b4b4, Te6edf3return_valueTff7b72=Tff7b72TrueTb4b4b4)Tb4b4b4,
Te6edf3patchTb4b4b4(
Ta5d6ff"Ta5d6ffmeshchatx.android_codec2.probe_pycodec2Ta5d6ff"Tb4b4b4, Te6edf3return_valueTff7b72=Tb4b4b4(Tff7b72FalseTb4b4b4, Ta5d6ff"Ta5d6ffmissingTa5d6ff"Tb4b4b4)
Tb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4:
Tff7b72assert Te6edf3tmTff7b72.Td2a8ffcodec2_availableTb4b4b4(Tb4b4b4) Tff7b72is Tff7b72False
T8b949e# ---------------------------------------------------------------------------
T8b949e# Adversarial: telephone init with web_audio_required
T8b949e# ---------------------------------------------------------------------------
Tff7b72def Td2a8fftest_adversarial_init_telephone_installs_hostless_when_requiredTb4b4b4(Te6edf3tmp_pathTb4b4b4)Tb4b4b4:
Te6edf3cfg Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3cfgTff7b72.Td2a8fftelephone_enabledTff7b72.Td2a8ffgetTff7b72.Td2a8ffreturn_value Tff7b72= Tff7b72True
Te6edf3cfgTff7b72.Td2a8fftelephone_audio_profile_idTff7b72.Td2a8ffgetTff7b72.Td2a8ffreturn_value Tff7b72= Te6edf3ProfilesTff7b72.Td2a8ffDEFAULT_PROFILE
Te6edf3identity Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3identityTff7b72.Td2a8ffhash Tff7b72= Ta5d6ffbTa5d6ff"Tffea00\x11Ta5d6ff" Tff7b72* T79c0ff16
Tff7b72with Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffmeshchatx.src.backend.telephone_manager.TelephoneTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3telephone_clsTb4b4b4:
Te6edf3telephone Tff7b72= Te6edf3telephone_clsTff7b72.Td2a8ffreturn_value
Te6edf3tm Tff7b72= Te6edf3TelephoneManagerTb4b4b4(
Te6edf3identityTff7b72=Te6edf3identityTb4b4b4,
Te6edf3config_managerTff7b72=Te6edf3cfgTb4b4b4,
Te6edf3storage_dirTff7b72=Tffa657strTb4b4b4(Te6edf3tmp_pathTb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3tmTff7b72.Td2a8ffweb_audio_required Tff7b72= Tff7b72True
Te6edf3tmTff7b72.Td2a8ffinit_telephoneTb4b4b4(Tb4b4b4)
Tff7b72assert Te6edf3hostless_lxst_audio_installedTb4b4b4(Tb4b4b4) Tff7b72is Tff7b72True
Te6edf3telephoneTff7b72.Td2a8ffset_busy_tone_timeTff7b72.Td2a8ffassert_calledTb4b4b4(Tb4b4b4)
Te6edf3telephoneTff7b72.Td2a8ffset_connect_timeoutTff7b72.Td2a8ffassert_calledTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8fftest_adversarial_init_telephone_skips_hostless_when_not_requiredTb4b4b4(Te6edf3tmp_pathTb4b4b4)Tb4b4b4:
Te6edf3cfg Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3cfgTff7b72.Td2a8fftelephone_enabledTff7b72.Td2a8ffgetTff7b72.Td2a8ffreturn_value Tff7b72= Tff7b72True
Te6edf3cfgTff7b72.Td2a8fftelephone_audio_profile_idTff7b72.Td2a8ffgetTff7b72.Td2a8ffreturn_value Tff7b72= Te6edf3ProfilesTff7b72.Td2a8ffDEFAULT_PROFILE
Te6edf3identity Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3identityTff7b72.Td2a8ffhash Tff7b72= Ta5d6ffbTa5d6ff"Tffea00\x22Ta5d6ff" Tff7b72* T79c0ff16
Tff7b72with Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffmeshchatx.src.backend.telephone_manager.TelephoneTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3tm Tff7b72= Te6edf3TelephoneManagerTb4b4b4(
Te6edf3identityTff7b72=Te6edf3identityTb4b4b4,
Te6edf3config_managerTff7b72=Te6edf3cfgTb4b4b4,
Te6edf3storage_dirTff7b72=Tffa657strTb4b4b4(Te6edf3tmp_pathTb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3tmTff7b72.Td2a8ffweb_audio_required Tff7b72= Tff7b72False
Te6edf3tmTff7b72.Td2a8ffinit_telephoneTb4b4b4(Tb4b4b4)
Tff7b72assert Te6edf3hostless_lxst_audio_installedTb4b4b4(Tb4b4b4) Tff7b72is Tff7b72False
T8b949e# ---------------------------------------------------------------------------
T8b949e# MeshChatX web_audio_required helper
T8b949e# ---------------------------------------------------------------------------
Tff7b72def Td2a8fftest_oracle_meshchat_web_audio_required_host_audio_unavailableTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72from T7ee787meshchatxT7ee787.T7ee787meshchat Tff7b72import Te6edf3ReticulumMeshChat
Te6edf3app Tff7b72= Te6edf3ReticulumMeshChatTff7b72.Td2a8ff__new__Tb4b4b4(Te6edf3ReticulumMeshChatTb4b4b4)
Te6edf3appTff7b72.Td2a8ff_headless Tff7b72= Tff7b72True
Te6edf3appTff7b72.Td2a8ff_host_audio_unavailable_cached Tff7b72= Tff7b72None
Tff7b72with Tb4b4b4(
Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffmeshchatx.meshchat._is_chaquopy_androidTa5d6ff"Tb4b4b4, Te6edf3return_valueTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4,
Te6edf3patchTff7b72.Td2a8ffobjectTb4b4b4(
Te6edf3ReticulumMeshChatTb4b4b4,
Ta5d6ff"Ta5d6ff_probe_host_audio_unavailableTa5d6ff"Tb4b4b4,
Te6edf3return_valueTff7b72=Tff7b72TrueTb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4:
Tff7b72assert Te6edf3appTff7b72.Td2a8ffweb_audio_requiredTb4b4b4(Tb4b4b4) Tff7b72is Tff7b72True
Tff7b72def Td2a8fftest_oracle_meshchat_web_audio_required_envTb4b4b4(Te6edf3monkeypatchTb4b4b4)Tb4b4b4:
Tff7b72from T7ee787meshchatxT7ee787.T7ee787meshchat Tff7b72import Te6edf3ReticulumMeshChat
Te6edf3app Tff7b72= Te6edf3ReticulumMeshChatTff7b72.Td2a8ff__new__Tb4b4b4(Te6edf3ReticulumMeshChatTb4b4b4)
Te6edf3appTff7b72.Td2a8ff_headless Tff7b72= Tff7b72False
Te6edf3appTff7b72.Td2a8ff_host_audio_unavailable_cached Tff7b72= Tff7b72False
Te6edf3monkeypatchTff7b72.Td2a8ffsetenvTb4b4b4(Ta5d6ff"Ta5d6ffMESHCHAT_FORCE_WEB_AUDIOTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff1Ta5d6ff"Tb4b4b4)
Tff7b72with Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffmeshchatx.meshchat._is_chaquopy_androidTa5d6ff"Tb4b4b4, Te6edf3return_valueTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4:
Tff7b72assert Te6edf3appTff7b72.Td2a8ffweb_audio_requiredTb4b4b4(Tb4b4b4) Tff7b72is Tff7b72True
Te6edf3monkeypatchTff7b72.Td2a8ffdelenvTb4b4b4(Ta5d6ff"Ta5d6ffMESHCHAT_FORCE_WEB_AUDIOTa5d6ff"Tb4b4b4, Te6edf3raisingTff7b72=Tff7b72FalseTb4b4b4)
Tff7b72def Td2a8fftest_oracle_meshchat_web_audio_not_required_when_host_audio_okTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72from T7ee787meshchatxT7ee787.T7ee787meshchat Tff7b72import Te6edf3ReticulumMeshChat
Te6edf3app Tff7b72= Te6edf3ReticulumMeshChatTff7b72.Td2a8ff__new__Tb4b4b4(Te6edf3ReticulumMeshChatTb4b4b4)
Te6edf3appTff7b72.Td2a8ff_headless Tff7b72= Tff7b72True
Te6edf3appTff7b72.Td2a8ff_host_audio_unavailable_cached Tff7b72= Tff7b72False
Te6edf3osTff7b72.Td2a8ffenvironTff7b72.Td2a8ffpopTb4b4b4(Ta5d6ff"Ta5d6ffMESHCHAT_FORCE_WEB_AUDIOTa5d6ff"Tb4b4b4, Tff7b72NoneTb4b4b4)
Tff7b72with Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffmeshchatx.meshchat._is_chaquopy_androidTa5d6ff"Tb4b4b4, Te6edf3return_valueTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4:
Tff7b72assert Te6edf3appTff7b72.Td2a8ffweb_audio_requiredTb4b4b4(Tb4b4b4) Tff7b72is Tff7b72False
Tff7b72def Td2a8fftest_oracle_headless_alone_does_not_force_web_audioTb4b4b4(Tb4b4b4)Tb4b4b4:
T8b949e"""Frozen Electron uses --headless but still has host speakers/mic."""
Tff7b72from T7ee787meshchatxT7ee787.T7ee787meshchat Tff7b72import Te6edf3ReticulumMeshChat
Te6edf3app Tff7b72= Te6edf3ReticulumMeshChatTff7b72.Td2a8ff__new__Tb4b4b4(Te6edf3ReticulumMeshChatTb4b4b4)
Te6edf3appTff7b72.Td2a8ff_headless Tff7b72= Tff7b72True
Te6edf3appTff7b72.Td2a8ff_host_audio_unavailable_cached Tff7b72= Tff7b72None
Te6edf3osTff7b72.Td2a8ffenvironTff7b72.Td2a8ffpopTb4b4b4(Ta5d6ff"Ta5d6ffMESHCHAT_FORCE_WEB_AUDIOTa5d6ff"Tb4b4b4, Tff7b72NoneTb4b4b4)
Tff7b72with Tb4b4b4(
Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffmeshchatx.meshchat._is_chaquopy_androidTa5d6ff"Tb4b4b4, Te6edf3return_valueTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4,
Te6edf3patchTff7b72.Td2a8ffobjectTb4b4b4(
Te6edf3ReticulumMeshChatTb4b4b4,
Ta5d6ff"Ta5d6ff_probe_host_audio_unavailableTa5d6ff"Tb4b4b4,
Te6edf3return_valueTff7b72=Tff7b72FalseTb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4:
Tff7b72assert Te6edf3appTff7b72.Td2a8ffweb_audio_requiredTb4b4b4(Tb4b4b4) Tff7b72is Tff7b72False
T8b949e# ---------------------------------------------------------------------------
T8b949e# Android codec2 candidate discovery
T8b949e# ---------------------------------------------------------------------------
Tff7b72def Td2a8fftest_android_codec2_honours_explicit_pathTb4b4b4(Te6edf3tmp_pathTb4b4b4, Te6edf3monkeypatchTb4b4b4)Tb4b4b4:
Tff7b72from T7ee787meshchatx Tff7b72import Te6edf3android_codec2
Te6edf3lib Tff7b72= Te6edf3tmp_path Tff7b72/ Ta5d6ff"Ta5d6fflibcodec2.soTa5d6ff"
Te6edf3libTff7b72.Td2a8ffwrite_bytesTb4b4b4(Ta5d6ffbTa5d6ff"Tffea00\x7fTa5d6ffELFTa5d6ff"Tb4b4b4)
Te6edf3monkeypatchTff7b72.Td2a8ffsetenvTb4b4b4(Ta5d6ff"Ta5d6ffMESHCHAT_LIBCODEC2_PATHTa5d6ff"Tb4b4b4, Tffa657strTb4b4b4(Te6edf3libTb4b4b4)Tb4b4b4)
Te6edf3candidates Tff7b72= Te6edf3android_codec2Tff7b72.Td2a8ff_libcodec2_candidatesTb4b4b4(Tb4b4b4)
Tff7b72assert Te6edf3libTff7b72.Td2a8ffresolveTb4b4b4(Tb4b4b4) Tff7b72in Tb4b4b4[Te6edf3cTff7b72.Td2a8ffresolveTb4b4b4(Tb4b4b4) Tff7b72for Te6edf3c Tff7b72in Te6edf3candidatesTb4b4b4]
Tff7b72def Td2a8fftest_android_codec2_native_lib_dirTb4b4b4(Te6edf3tmp_pathTb4b4b4, Te6edf3monkeypatchTb4b4b4)Tb4b4b4:
Tff7b72from T7ee787meshchatx Tff7b72import Te6edf3android_codec2
Te6edf3native Tff7b72= Te6edf3tmp_path Tff7b72/ Ta5d6ff"Ta5d6ffarm64-v8aTa5d6ff"
Te6edf3nativeTff7b72.Td2a8ffmkdirTb4b4b4(Tb4b4b4)
Te6edf3lib Tff7b72= Te6edf3native Tff7b72/ Ta5d6ff"Ta5d6fflibcodec2.soTa5d6ff"
Te6edf3libTff7b72.Td2a8ffwrite_bytesTb4b4b4(Ta5d6ffbTa5d6ff"Tffea00\x7fTa5d6ffELFTa5d6ff"Tb4b4b4)
Te6edf3monkeypatchTff7b72.Td2a8ffsetenvTb4b4b4(Ta5d6ff"Ta5d6ffMESHCHAT_NATIVE_LIB_DIRTa5d6ff"Tb4b4b4, Tffa657strTb4b4b4(Te6edf3nativeTb4b4b4)Tb4b4b4)
Te6edf3candidates Tff7b72= Te6edf3android_codec2Tff7b72.Td2a8ff_libcodec2_candidatesTb4b4b4(Tb4b4b4)
Tff7b72assert Te6edf3libTff7b72.Td2a8ffresolveTb4b4b4(Tb4b4b4) Tff7b72in Tb4b4b4[Te6edf3cTff7b72.Td2a8ffresolveTb4b4b4(Tb4b4b4) Tff7b72for Te6edf3c Tff7b72in Te6edf3candidatesTb4b4b4]
T8b949e# ---------------------------------------------------------------------------
T8b949e# Bridge push through hostless audio_input before WebAudioSource swap
T8b949e# ---------------------------------------------------------------------------
Tff7b72def Td2a8fftest_push_client_frame_uses_hostless_audio_input_before_swapTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3tele Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3teleTff7b72.Td2a8ffactive_call Tff7b72= Tffa657objectTb4b4b4(Tb4b4b4)
Te6edf3hostless Tff7b72= Te6edf3HostlessAudioSourceTb4b4b4(Te6edf3target_frame_msTff7b72=T79c0ff60Tb4b4b4, Te6edf3sinkTff7b72=Te6edf3MagicMockTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3hostlessTff7b72.Td2a8ffsinkTff7b72.Td2a8ffcan_receiveTff7b72.Td2a8ffreturn_value Tff7b72= Tff7b72True
Te6edf3teleTff7b72.Td2a8ffaudio_input Tff7b72= Te6edf3hostless
Te6edf3tele_mgr Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3tele_mgrTff7b72.Td2a8fftelephone Tff7b72= Te6edf3tele
Te6edf3tele_mgrTff7b72.Td2a8ffis_voicemail_session_active Tff7b72= Tff7b72False
Te6edf3bridge Tff7b72= Te6edf3WebAudioBridgeTb4b4b4(Te6edf3tele_mgrTb4b4b4, Te6edf3MagicMockTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3force_enabledTff7b72=Tff7b72TrueTb4b4b4)
Te6edf3bridgeTff7b72.Td2a8fftx_source Tff7b72= Tff7b72None
Te6edf3pcm Tff7b72= Te6edf3npTff7b72.Td2a8ffzerosTb4b4b4(T79c0ff80Tb4b4b4, Te6edf3dtypeTff7b72=Te6edf3npTff7b72.Td2a8ffint16Tb4b4b4)Tff7b72.Td2a8fftobytesTb4b4b4(Tb4b4b4)
Te6edf3bridgeTff7b72.Td2a8ffpush_client_frameTb4b4b4(Te6edf3pcmTb4b4b4)
Te6edf3hostlessTff7b72.Td2a8ffsinkTff7b72.Td2a8ffhandle_frameTff7b72.Td2a8ffassert_calledTb4b4b4(Tb4b4b4)
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────